# _*_ coding:utf-8 _*_
# 开发团队: Mavericks
# 开发人员：Maverick·Ming
# 开发IDE： PyCharm
#   项目名：HelloWorld
#   文件名：6.06 封装_隐藏属性.py
# 开发时间：2021/3/26 10:11

class Mavericks:
    """This is a coder of the Team-Mavericks"""
    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_name(self, name):
        self.__name = name

    # 公有方法
    def say_hello(self, say):
        print(self.__name, "向您say %s " % say)


# 如何隐藏属性？方式一：改一个外部不知道的属性名（name -> hidden_name）
mm = Mavericks('MaverickMing')


# 根据以上发现：
#   5.使用getter方法可以表示一些计算的属性（如getter_area，直接根据边长获取面积）

# 只是用hidden_name，并没有真正做到隐藏数据，可以用__xxx开头隐藏数据
# 双下划线开头的属性，是对象的隐藏属性，只能在类的内部访问，无法通过对象访问
# print(mm.get_name())  # 访问得到，属于类内部的方法访问隐藏属性
# print(__name) # 访问不到：NameError: name '__name' is not defined

# __name是隐藏属性，无法通过对象mm.__name访问，也无法这样修改
# 这样的原理：实际上是把hidden_name修改成_Person_name,只不过把Person隐藏后成了__name
# 所以__name隐藏属性的方式，与hidden_name类似，外部依然可以通过getter、setter方法读写属性值
# 一般不用


# 一般会将私有属性(不希望外部访问的属性)以_开头
# 一般情况下，使用_开头的属性是 私有属性，没有特殊需要，不要修改私有属性
class Person:
    """This is a Human"""
    def __init__(self, name):
        self._name = name

    def get_name(self):
        return self._name

    def set_name(self, name):
        self._name = name
